package com.ym.common.enums;

import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 阿里云短信模板
 *
 * @author: 李涛
 * @version: 2019年05月17日 17:58
 */
public enum SmsTemplateEnum {


	/**
	 * 模版名称:通用验证码
	 * <p>
	 */
	UNIVERSAL_VERIFICATION_CODE("SMS_173141326", "您的验证码${code}，该验证码5分钟内有效，请勿泄漏于他人！"),

	/**
	 * 模版名称:身份验证验证码
	 * <p>
	 */
	AUTHENTICATION_CODE("SMS_173191624", "验证码${code}，您正在进行身份验证，打死不要告诉别人哦！"),

	/**
	 * 模版名称:登录确认验证码
	 * <p>
	 */
	LOGON_CONFIRMATION_AUTHENTICATION_CODE("SMS_173191623", "验证码${code}，您正在登录，若非本人操作，请勿泄露。"),


	/**
	 * 模版名称:登录异常验证码
	 * <p>
	 */
	LOGON_EXCEPTION_AUTHENTICATION_CODE("SMS_173191622", "验证码${code}，您正尝试异地登录，若非本人操作，请勿泄露。"),

	/**
	 * 模版名称:用户注册验证码
	 * <p>
	 */
	USER_REGISTRATION_AUTHENTICATION_CODE("SMS_173191621", "验证码${code}，您正在注册成为新用户，感谢您的支持！"),

	/**
	 * 模版名称:修改密码验证码
	 * <p>
	 */
	MODIFY_PASSWORD_AUTHENTICATION_CODE("SMS_173191620", "验证码${code}，您正在尝试修改登录密码，请妥善保管账户信息。"),

	/**
	 * 模版名称:信息变更验证码
	 * <p>
	 */
	INFORMATION_CHANGE_VERIFICATION_CODE("SMS_173191619", "验证码${code}，您正在尝试变更重要信息，请妥善保管账户信息。"),

	/**
	 * 模版名称:医生资料审核不通过
	 * <p>
	 * 变量：p2-其他；p3-电话号码；
	 * <p>
	 * 备注：用户资料审核不通过，发送短信告诉用户！
	 */
	DATA_AUDIT_FAILED("SMS_174986989", "抱歉，您暂未通过资质审核，未通过原因：${p2}。客服电话：${p3}"),


	/**
	 * 模版名称:医生资料审核通过
	 * <p>
	 * 变量：p2-金额；
	 * <p>
	 * 备注：用户资料审核通过，发送短信通知用户！
	 */
	DATA_AUDIT_SUCCESS("SMS_174986992", "恭喜，您已通过资质审核，请登录APP开启您的个人诊所之旅吧，完成首单可获得${p2}元奖励哦！"),

	/**
	 * 模版名称:用户注册通知
	 * <p>
	 * 变量：p2-其他；p3-电话号码；p4-其他号码；p5-金额；p6-电话号码；
	 * <p>
	 * 备注：注册我方亚米健康产品后，发送此短信通知用户注册成功！
	 */
	USER_REGISTRATION_NOTICE("SMS_174986988", "您已成功注册${p2}，账号${p3} ，初始密码 ${p4}。快去亚米健康完成医疗资质认证开启您的线上诊所赢取 ${p5} 元奖励。客服电话：${p6}。"),

	/**
	 * 模版名称:电话预约成功
	 * <p>
	 * 变量：p2-其他；p3-其他；p4-时间；p5-时间；p6-电话号码；
	 * <p>
	 * 备注：用户电话预约成功后，发送短信通知用户
	 */
	SUCCESSFUL_TELEPHONE_RESERVATION("SMS_174991908", "您预约了${p2}医生的${p3}，时间${p4}，共${p5}分钟，到时您会接到${p6}的来电，请保持电话畅通。"),

	/**
	 * 模版名称:图文问诊支付成功
	 * <p>
	 * 变量：p2-金额；p3-其他；
	 * <p>
	 * 备注：图文问诊支付成功后，向用户发送短信通知
	 */
	SUCCESSFUL_PAYMENT_FOR_CONSULTATION("SMS_174991905", "您刚支付了${p2}元向${p3}医生医生提问。可在我的问诊/当前问诊中找到该问题，查看医生回复。"),

	/**
	 * 模版名称:图问问诊医生首次回复
	 * <p>
	 * 变量：p2-其他；p3-其他号码；p4-电话号码；
	 * <p>
	 * 备注：图问问诊医生首次回复后，需要发送短信告诉用户，让用户及时查看订单
	 */
	DOCTOR_FIRST_REPLY("SMS_174986972", "医生${p2}回复了您的问题，请您及时查看并进行后续交流。问题将在${p3}小时后关闭。 有疑问请联系客服 ${p4}。"),

	/**
	 * 模版名称:问诊电话开始短信提醒
	 * <p>
	 * 变量：p2-其他；p3-其他；p4-电话号码；
	 * <p>
	 * 备注：问诊电话服务快要开始的时候，向患者发送短信提醒。
	 */
	INQUIRY_TELEPHONE_START_SHORT_MESSAGE_REMINDER("SMS_174991891", "您预约了${p2}医生的${p3}服务即将开始，请您合理按排时间，注意接听。到时您会接到${p4}的来电，请保持电话畅通。"),


	/**
	 * 模版名称:患者预约成功推送
	 * <p>
	 * 变量：p0-其他；p1-其他；p2-时间；
	 * <p>
	 * 备注：患者预约成功推送短信给医生，让医生及时联系患者
	 */
	SUCCESSFUL_PUSH_OF_PATIENT_APPOINTMENT("SMS_175245305", "${p0}医生您好，${p1}患者预约了电话问诊服务，请于${p2}在亚米医疗APP端拨打电话"),


	/**
	 * 模版名称:医生电话问诊即将开始通知
	 * <p>
	 * 变量：p0-其他；p1-其他；
	 * <p>
	 * 备注：医生电话问诊即将开始通知
	 */
	DOCTOR_S_TELEPHONE_CONSULTATION_IS_ABOUT_TO_START("SMS_175240289", "${p0}医生您好，${p1}患者预约的电话问诊服务即将开始，请及时拨打电话。"),

	/**
	 * 模版名称:提醒用户审核
	 * <p>
	 * 变量：
	 * <p>
	 * 备注：有新提交的项目需要审核，请登录系统进行审核！
	 */
	REMIND_USERS_TO_AUDIT("SMS_189712053", "有新提交的项目需要审核，请登录系统进行审核！"),

	/**
	 * 模版名称:项目审核通知
	 * <p>
	 * 变量：status-审核通过/审核失败
	 * <p>
	 * 备注：有新提交的项目需要审核，请登录系统进行审核！
	 */
	PROJECT_AUDIT_NOTICE("SMS_189712067", "您提交的项目${status}，请登录系统进行查看！"),

	/**
	 * 项目审核通过  通知委员会成员
	 */
	COMMITTEE_NOTICE("SMS_193231277", "尊敬的认证委员:${name}您好，${title}项目已审核通过,请您关注!"),

	;
	private String code;

	private String content;

	private static final Pattern pattern = Pattern.compile("\\$\\{[^}]*\\}");

	private static final Logger LOGGER = LoggerFactory.getLogger(SmsTemplateEnum.class);

	SmsTemplateEnum(String code, String content) {
		this.code = code;
		this.content = content;
	}

	public String getCode() {
		return code;
	}

	/**
	 * 输入对应模板的参数，生成JSON格式
	 *
	 * @param prams
	 * @return
	 */
	public String buildParams(Object... prams) {
		JSONObject buildParams = new JSONObject();
		String content = this.content;
		Matcher matcher = pattern.matcher(content);
		int index = 0;
		List<String> logs = new ArrayList<>();
		while (matcher.find()) {
			String group = matcher.group(0);
			logs.add(group);
			String key = group.replaceAll("\\$|\\{|\\}", "");
			buildParams.put(key, prams[index]);
			index++;
		}
		for (int i = 0; i < logs.size(); i++) {
			content = content.replace(logs.get(i), String.valueOf(prams[i]));
		}
		String result = buildParams.toJSONString();
		LOGGER.info("发送SMS内容为：{}", content);
		LOGGER.info("发送SMS参数为：{}", result);
		return result;
	}

}
